home *** CD-ROM | disk | FTP | other *** search
- // STree.cpp: Implementierung der Klasse STree.
- //
- //////////////////////////////////////////////////////////////////////
-
- #include "stdafx.h"
- #include "STree.h"
-
- #include <math.h>
- #include <stdlib.h>
-
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
-
- #define ROT_SPEED 0.005f
- #define ROT_MAX 15.0f
- #define ROT_DIMINUATION 1.005f
- #define SHRINK_SPEED -0.0005f
- #define FLY_SPEED 0.01f
-
-
- enum
- {
- DESTR_FLYING,
- DESTR_SHRINKING
- };
-
-
- //////////////////////////////////////////////////////////////////////
- // Konstruktion/Destruktion
- //////////////////////////////////////////////////////////////////////
-
- STree::STree()
- {
- quadric = NULL;
- position[0] = 0.0f;
- position[1] = 0.0f;
- position[2] = 0.0f;
- treeState = STATE_SHOWN;
- matrixPos[0] = 0;
- matrixPos[1] = 0;
- rotation[0] = 0.0f;
- rotation[1] = 0.0f;
- rotSpeed[0] = 0.0f;
- rotSpeed[1] = 0.0f;
- lastRealPos[0] = 0.0f;
- lastRealPos[1] = 0.0f;
- size = 1.0f;
- destructionMethod = 0;
- }
-
- STree::~STree()
- {
- if (quadric)
- {
- gluDeleteQuadric(quadric);
- }
- }
-
- bool STree::create(STexture* texBaum, STexture* texStamm)
- {
- baum = texBaum;
- stamm = texStamm;
-
- quadric = gluNewQuadric();
- gluQuadricTexture(quadric,GL_TRUE);
- gluQuadricNormals(quadric,GL_SMOOTH);
-
- return true;
- }
-
- void STree::setPosition(float x, float y, float z)
- {
- lastRealPos[0] = position[0];
- lastRealPos[1] = position[1];
- position[0] = x;
- position[1] = y;
- position[2] = z;
- }
-
- void STree::update(float frametime)
- {
- if (treeState == STATE_HIDDEN)
- {
- return;
- }
- else if (treeState == STATE_DRAGGING)
- {
- rotSpeed[0] += (lastRealPos[1] - position[1])/80.0f;
- rotSpeed[1] -= (lastRealPos[0] - position[0])/80.0f;
-
- rotation[0] += rotSpeed[0]*frametime;
- rotation[1] += rotSpeed[1]*frametime;
-
- if (fabs(rotation[0]) >= ROT_MAX)
- {
- rotSpeed[0] /= -ROT_DIMINUATION;
- }
-
- if (fabs(rotation[1]) >= ROT_MAX)
- {
- rotSpeed[1] /= -ROT_DIMINUATION;
- }
-
- rotation[0] /= ROT_DIMINUATION;
- rotation[1] /= ROT_DIMINUATION;
-
- rotSpeed[0] /= ROT_DIMINUATION;
- rotSpeed[1] /= ROT_DIMINUATION;
-
-
- /*rotSpeed[0] += (rotSpeed[0] < 0 ? 1.0f : -1.0f)*ROT_DIMINUATION*frametime;
- rotSpeed[1] += (rotSpeed[1] < 0 ? 1.0f : -1.0f)*ROT_DIMINUATION*frametime;*/
- }
- else if (treeState == STATE_DESTROYING)
- {
- switch (destructionMethod)
- {
- case DESTR_SHRINKING:
- size += SHRINK_SPEED*frametime;
-
- if (size <= 0.2f)
- {
- treeState = STATE_HIDDEN;
- }
- break;
- case DESTR_FLYING:
- position[2] += FLY_SPEED*frametime;
-
- if (position[2] >= 25.0f)
- {
- treeState = STATE_HIDDEN;
- }
- break;
- }
- }
-
- draw();
- }
-
- void STree::draw()
- {
- ////////////////
- // ZEICHNEN
- ////////////////
-
- glPushMatrix();
-
- //Position des Baums
- glTranslatef(position[0],position[1],
- position[2] + (treeState == STATE_DRAGGING ? 0.75f : 0.0f));
-
- //Wankel des Baums
- if (treeState == STATE_DRAGGING)
- {
- glRotatef(rotation[0],1.0f,0.0f,0.0f);
- glRotatef(rotation[1],0.0f,1.0f,0.0f);
- }
- else if (treeState == STATE_DESTROYING &&
- destructionMethod == DESTR_SHRINKING)
- {
- glScalef((size < 0.2f ? 0.2f:size),(size < 0.2f ? 0.2f:size),
- (size < 0.2f ? 0.2f:size));
- }
-
-
- //**Baumwipfel**
-
- baum->select();
- //Ein bisschen zurⁿck damit dass auch richtig gezeichnet wird;)
- glTranslatef(0.0f,0.0f,-BAUM_HOEHE);
- gluCylinder(quadric,BAUM_BREITE,0.0f,BAUM_HOEHE,20,4);
-
- //**Baumstamm**
-
- stamm->select();
-
- glTranslatef(0.0f,0.0f,-STAMM_HOEHE);
- gluCylinder(quadric,STAMM_BREITE,STAMM_BREITE,STAMM_HOEHE,20,4);
-
- glPopMatrix();
- }
-
-
- bool STree::click(float x, float y)
- {
- if (treeState == STATE_HIDDEN)
- {
- return false;
- }
-
- if (x >= position[0]-BAUM_BREITE && x <= position[0]+BAUM_BREITE &&
- y >= position[1]-BAUM_BREITE && y <= position[1]+BAUM_BREITE)
- {
- setState(STATE_DRAGGING);
-
- /*lastPos[0] = matrixPos[0];
- lastPos[1] = matrixPos[1];*/
-
- return true;
- }
-
- return false;
- }
-
- void STree::setState(STreeState state)
- {
- if (state == STATE_DRAGGING)
- {
- rotSpeed[0] = ROT_SPEED;
- }
- else if (state == STATE_DESTROYING)
- {
- destructionMethod = rand() % 2;
- size = 1.0f;
- position[2] = 0.0f;
- }
-
- treeState = state;
- }
-
- int STree::getXMatrixPos()
- {
- return matrixPos[0];
- }
-
- int STree::getYMatrixPos()
- {
- return matrixPos[1];
- }
-
- int* STree::resolveFinalPos(float xTest, float yTest)
- {
- static int possibility[2] = {0};
-
- possibility[0] = 0;
- possibility[1] = 0;
-
- //** MATRIX POS RAUSKRIEGEN
-
-
-
- if (!(xTest <= -3.0f*SPACE-SPACE*0.5f || xTest >= 3.0f*SPACE+SPACE*0.5f ||
- yTest >= 3.0f*SPACE+SPACE*0.5f || yTest <= -3.0f*SPACE-SPACE*0.5f))
- {
- for (float x = -3.0f*SPACE; x <= 3.0f*SPACE; x += SPACE)
- {
- possibility[1] = 0;
-
- for (float y = 3.0f*SPACE; y >= -3.0f*SPACE; y -= SPACE)
- {
- if (xTest >= x-SPACE*0.5f && xTest <= x+SPACE*0.5f &&
- yTest >= y-SPACE*0.5f && yTest <= y+SPACE*0.5f)
- {
- if ((possibility[0] < 2 && possibility[1] < 2) ||
- (possibility[0] > 4 && possibility[1] < 2) ||
- (possibility[0] < 2 && possibility[1] > 4) ||
- (possibility[0] > 4 && possibility[1] > 4))
- {
- possibility[0] = -1;
- possibility[1] = -1;
- }
-
- return possibility;
- }
-
- possibility[1] += 1;
- }
-
- possibility[0] += 1;
- }
- }
- else
- {
- possibility[0] = -1;
- possibility[1] = -1;
- }
-
-
- return possibility;
- }
-
- void STree::setFinalPos(int xTest, int yTest)
- {
- /* lastPos[0] = matrixPos[0];
- lastPos[1] = matrixPos[1];*/
-
- setPosition(
- (xTest*6*SPACE)/6 - (3.0f*SPACE),
- -((yTest*6*SPACE)/6) + (3.0f*SPACE),0.0f);
-
- matrixPos[0] = xTest;
- matrixPos[1] = yTest;
- }
-
- //DEL int* STree::getLastPos()
- //DEL {
- //DEL return lastPos;
- //DEL }
-
- STreeState STree::getState()
- {
- return treeState;
- }
-